package thread;



import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Creared with IntelliJ IDEA.
 * Description:标准库的线程池
 * User:yxd
 * Date:2022-03-29
 * Time:17:00
 */
//ThreadPoolExecutor这个线程池在这里使用是比较复杂的(构造方法的参数:int corePollSize核心线程数(正式员工的数量),int maximumPoolSize(最大线程数+临时工)
// long keepAliveTime(可以理解为临时工摸鱼的时间),TimeUnit unit(时间的单位s,ms,us...),BlockingQueue<Runnable> workQueue(任务队列,线程池会提供一个submit方法,让程序员把任务注册到线程池中,加到这个任务队列,但是这个没有优先级,先进先出就行
// ThreadFactory th(线程工厂,线程是怎么创建出来的)RejectedExecutionHandler handler(拒绝策略,当任务队列满了,怎么做?1.直接忽略最新任务,2.阻塞等待3.直接丢弃最老的任务....))
    //这里最重要的缓释第一组参数线程池中线程的个数!!!有一个程序,这个程序要并发的/多线程的来完成一些任务,如果使用线程池的话,这里的线程数设为多少最合适呢?
    //这里网上的回答是错误的,这里是给不出具体的答案的,应该通过性能测试来获得合适的值,例如写一个服务器程序,服务器李通过线程池,多线程的处理用户请求,就可以对这个服务器进行性能测试,比如构造一些请求,发送给服务器,
// 要测试性能,这里的请求就需要构造很多,比如每秒发送500/1000/2000..根据十几的业务场景构造一个合适的值,根据这里不同线程池的线程数,来观察,程序处理任务的速度,程序持有的CPU的占用率,
// 当线程数多了,整体的速度是会变快,但是CPU占用率也会高,当线程数少了,整体的速度是会变慢,但是CPU占用率也会下降,那么就需要找到一个程序速度能接受,并且COU占用也合理这样的平衡点.
// 不同类型的程序,因为单个任务,里面CPU上计算的时间和阻塞的时间分布是不相同的,因此给出一个具体的数字往往是不靠谱的,需要性能测试,找到平衡点

//弄了多线程就是为了程序跑的快,为啥要考虑不让CPU占用率太高? 对于服务器来说要留有一定的冗余!!随时应对一些可能的突发情况
//那么我们这使用一个简化版的线程池Executors它是对上面复杂的线程池进行了封装,提供了一些默认参数
public class Demo25 {
    public static void main(String[] args) {
        //创建一个固定线程数目的线程池,参数指定了线程个数
        ExecutorService pool = Executors.newFixedThreadPool(10);//这是最常用的
        //创建了一个自动扩容的线程池,会根据任务量来进行自动扩容
        Executors.newCachedThreadPool();
        //创建一个只有一个线程的线程池
        Executors.newSingleThreadExecutor();
        //创建一个带有定时器功能的线程池,类似于Timer
        //Executors.newScheduledThreadPool();
        for (int i = 0; i < 100; i++) {//注册多个任务
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello threadpool");
                }
            });
        }

    }
}
